package com.repair.file.service.impl;

import cn.hutool.core.date.DateTime;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.repair.file.service.OssService;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

/**
 * @author chunyu
 * @since 2024/9/27,20:41
 * 这里参照发短信那么写
 */
@Slf4j
@Getter
@Setter
@Service
public class OssServiceImpl implements OssService {

    private String endpoint;

    private String accessKeyId;

    private String accessKeySecret;

    private String bucketName;

    @Override
    public String updatePhoto(MultipartFile file) {


        InputStream inputStream = null;
        // 填写文件名。文件名包含路径，不包含Bucket名称。例如exampledir/exampleobject.txt。
        String url = null;

        OSS ossClient = null;
        try {
            // 创建OSSClient实例。
            ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            // 创建存储空间。
            ossClient.createBucket(bucketName);
            // 创建文件流
            inputStream = file.getInputStream();

            // 日期文件夹 DataTime 是jada包封装的时间类 可以简单定义时间格式
            String datePath = new DateTime().toString("yyyy/MM/dd");
            // 文件名可能重复上传 加上uuid避免
            String uuid = UUID.randomUUID().toString().replaceAll("-", "");
            // 文件最后的路径
            String objectName = uuid + file.getOriginalFilename();
            objectName = datePath + "/" + objectName;

            // 文件上传至阿里云
            ossClient.putObject(bucketName, objectName, inputStream);

            // 返回值要返回 访问云存储的url
            // https:// home-repair-system . oss-cn-beijing.aliyuncs.com / 111.png
            // 拼接出来
            url = "http://" + bucketName + "." + endpoint + "/" + objectName;

        } catch (OSSException | IOException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // 关闭OSSClient。
            assert ossClient != null;
            ossClient.shutdown();
        }
        return url;
    }


}
